<?php
if(isset($GLOBALS['context']))	require_lib('openapi/OpenAPIRequest',false);
else	require_once dirname(__FILE__).'/../OpenAPIRequest.class.php';

/** 
 * 传送拍拍接口[简称paipai]API参数到网店http://api.paipai.com/,得到相应返回值。
 * @author alex  
 * @version v1.0  2010-5-8
 */
class PaiPaiRequest extends OpenAPIRequest {
	/**
	 * paipai API的网站地址：http://api.paipai.com/
	 */
	const HOST_URL='http://api.paipai.com/';
	/**
	 * paipai 沙箱测试环境的网站地址
	 */		
	const SANDBOX_URL='http://apitest.paipai.com/';
		
	/**
	 * @var array $app_token 应用app访问paipai的令牌，参数包括：<br/>
	 * string uin  操作用户QQ号码，用于认证操作用户的身份.<br/>
	 * string token:用于认证操作用户的身份.<br/>
	 * string spid:用于验证请求包是否被篡改.<br/>
	 * string skey:用户登录session[secretKey]，用于用户鉴权，将相关参数通过md5加密为一个sign值.
	 */
	var $app_token=array();
	
	
	/**
	 * @var array $app_setting 应用app访问paipai的通用参数设置，一般不改变默认值，包括：<br/>
	 * string charset：指定输入和输出的编码，paipai默认为 "gbk",charset只能作为URL参数提供"utf-8"，此处设为gbk,utf-8可能没有效果。<br/>
	 * string format：输出格式，"json"（默认），一般情况使用json。<br/>
	 * string pureData：是否只需要json数据，非0：只需要json数据，0（默认）：会多出变量定义、try…catch块之类
	 */
	var $app_setting=array('charset'=>'gbk','format'=>'json','pureData'=>1);

	/**
	 * @var bool $isRunInSandBox 是否在沙箱测试环境下运行，默认true
	 */
	var $in_sandbox=true;
		
    function __construct(){
    	parent::__construct();
    	$this->httpmethod=self::HTTPMETHOD_GET;
    }		
	/**
	 * 得到paipai API的返回值，JSON字符串。
	 * @param string $cmdid 要调用的api接口的cmdid字符串，如user.getUserInfo，如果为空，将返回false.
	 * @param array $params 要调用的api接口的参数数组，一般通用的参数不要传，如charset，format等。
	 * @return string|bool 调用的api接口得到的JSON字符串。
	 */
	function &get_resp($cmdid,array $params){
		if(! $cmdid) return false;
		
		//组装url,method GET.
		$cmdurl=str_replace('.','/',$cmdid).'.xhtml';
		$token=$this->app_token;
		unset($token['skey']);
		$params=$params + $this->app_setting;
		$params=$params+$token;
		$params['sign']=$this->_createSign($cmdid,$params);
		
		$host_url=$this->in_sandbox ? self::SANDBOX_URL : self::HOST_URL;
		$host_url .= $cmdurl;
		$result=& $this->send($host_url,$params);
		$result=iconv('gbk','utf-8',$result);
		return $result;		
	}
	
	/**
	 * 得到paipai API的返回值，JSON生成的数组。
	 * @param string $cmdid 要调用的api接口的cmdid字符串，如user.getUserInfo，如果为空，将返回false.
	 * @param array $params 要调用的api接口的参数数组，一般通用的参数不要传，如charset，format等。
	 * @param string $resp_handle 用于额外处理get_resp函数返回字符串的函数名称，此函数调用在调用get_resp函数后，解析为数组前，默认为NULL不调用。
	 * @return array|bool 调用的api接口得到的 JSON生成的数组。
	 */	
	protected function &get_array($cmdid,array $params,$resp_handle=NULL){
		if(!($result=&$this->get_resp($cmdid,$params))) return false;
		if($resp_handle)  //addition handle result 
		   try{$result = $resp_handle($result);}catch (Exception  $e){}		
		if (version_compare(PHP_VERSION,'5.3.0')<0) 
		   $result = preg_replace('/(":)(\d{9,})/i', '${1}"${2}"', $result);		
		$arr=json_decode($result,true);
		if ($arr == NULL) {
			//for paipai normal handle
			$patterns = array ('/,+\s*\}/', '/,+\s*\]/', '/\\\{1,3}/','/"\s+|\s+"/' );
			$replacements = array ('}', ']', '\\\\\\\\','"');
			$result = preg_replace ( $patterns, $replacements, $result );

			$arr = json_decode ( $result, true );
		}
		return $arr;
	}	
	/**
	 * 检查接口调用get*函数返回是否有错误
	 * @param  mixed $result  接口调用get*函数返回值.
	 * @return bool true 接口调用有效，false 接口调用出错.
	 */
	protected function check_result(&$result){
		if(is_array($result)){
			if(array_key_exists('errorCode',$result) && $result['errorCode'] == 0)
			  return true;
		}elseif (is_string($result)){
			$match=array();
			if(preg_match('/".*errorCode.*:\d/',$result,$match)){
			  $m=preg_split('/:/',$match[0]);
			  if(count($m)>1 && $m[1] == 0)
			     return true;
			}
		}
		elseif(is_bool($result))
		 return $result;
		 
		return false;
	}
	/*
	 * 签名函数,内部用 
	 */
    private function _createSign($cmdid, $paramArr) {
		$sign= & $this->_to_sign_str($paramArr);
		return md5($cmdid . $sign . $this->app_token['skey']);
	}	
}

